#include "logger.h"
#include "loggerprivate.h"

/************************************************
 * 功能：构造函数
 * 输入参数：
 *      pInfo -- 日志文件文件配置
 ************************************************/
Logger::Logger( Logging::RotateConfigInfo* pInfo )
    :d( new LoggerPrivate() )
{
    if( NULL == pInfo )
    {
        qWarning() << "Logger::Logger: input info is NULL!";
    }
    else
    {
        d->load( pInfo );
    }
}

/************************************************
 * 功能：构造函数
 * 输入参数：
 *      pInfo -- 日志文件文件配置
 ************************************************/
Logger::Logger( Logging::TimeConfigInfo* pInfo )
    :d( new LoggerPrivate() )
{
    if( NULL == pInfo )
    {
        qWarning() << "Logger::Logger: input info is NULL!";
    }
    else
    {
        d->load( pInfo );
    }
}

/************************************************
 * 功能：析构函数
 ************************************************/
Logger::~Logger()
{
}

/************************************************
 * 功能：获取记录句柄
 * 输入参数：
 *      eLevel -- 等级
 * 返回：对应的句柄
 ************************************************/
LogInstance Logger::log( Logging::LogLevel eLevel )
{
    return LogInstance( eLevel, d );
}

/************************************************
 * 功能：trace记录
 * 返回：trace句柄引用
 ************************************************/
LogInstance Logger::trace()
{
    LogInstance instance( Logging::TRACE, d );

    return instance;
}


/************************************************
 * 功能：debug记录
 * 返回：debug句柄引用
 ************************************************/
LogInstance Logger::debug()
{
    LogInstance instance( Logging::DEBUG, d );

    return instance;
}

/************************************************
 * 功能：info记录
 * 返回：info句柄引用
 ************************************************/
LogInstance Logger::info()
{
    LogInstance instance( Logging::INFO, d );

    return instance;
}

/************************************************
 * 功能：warn记录
 * 返回：warn句柄引用
 ************************************************/
LogInstance Logger::warn()
{
    LogInstance instance( Logging::WARN, d );

    return instance;
}

/************************************************
 * 功能：error记录
 * 返回：error句柄引用
 ************************************************/
LogInstance Logger::error()
{
    LogInstance instance( Logging::ERROR, d );

    return instance;
}

/************************************************
 * 功能：fatal记录
 * 返回：fatal句柄引用
 ************************************************/
LogInstance Logger::fatal()
{
    LogInstance instance( Logging::FATAL, d );

    return instance;
}

/************************************************
 * 功能：设置日志等级
 * 输入参数：
 *       eLogLevel -- 日志等级
 ************************************************/
void Logger::setLogLevel( Logging::LogLevel eLogLevel )
{
    d->m_eLogLevel = eLogLevel;
}

/************************************************
 * 功能：获取日志等级
 * 返回：日志等级
 ************************************************/
Logging::LogLevel Logger::logLevel() const
{
    return d->m_eLogLevel;
}

/************************************************
 * 功能：使能调试输出
 * 输入参数：
 *       eLogLevel -- 调试输出的日志等级
 ************************************************/
void Logger::enableDebugOutput( Logging::LogLevel eLogLevel )
{
    if( d->m_destDebug.isNull() )
    {
        QsLogging::DestinationPtr debugDestination( QsLogging::DestinationFactory::MakeDebugOutputDestination() );

        d->m_destDebug = debugDestination;
        d->m_eDebugLevel = eLogLevel;
    }
    else
    {
        qWarning() << "Logger::enableDebugOutput: function can only enabled once!";
    }
}

/*************************************************
功能： 将日志输出到接收日志的自定义对象
输入参数： receiver：接收日志消息对象指针
          member：响应日志消息槽函数，槽函数参数格式为(QString, int)：QString - 日志内容 int - 日志级别
*************************************************************/
void Logger::addReceiver(QObject *receiver, const char *member)
{
    QsLogging::DestinationPtr functorDestination( QsLogging::DestinationFactory::MakeFunctorDestination(receiver, member) );

    d->addDestination(functorDestination);
}
